// 做鉴权的， 获取用户权限的，例如 不同用户对应菜单

// 登录过的，能访问其他页面，不能访问登录页
// 没登录过的，能访问登录页，不能访问其他页面

// 拿到路由
import router from "@/router/index"
// 引入 nprogress js
import NProgress from "nprogress"
// 引入 nprogress css
import "nprogress/nprogress.css"
import { getToken } from "@/utils/auth"
import { useUserStore } from "./stores/user"

import { usePermissionStore } from "./stores/permission"
// 不要 NProgress 的某个 特效
NProgress.configure({ showSpinner: false })

// 配置哪些页面不需要做Token校验
const whiteList = ["/login"]
// 每个页面加载之前，判断页面是否登录过
// 新版本，是可以写 async await  返回 通过 true 和 不通过 false
router.beforeEach(async (to) => {
  // 开启 loading
  NProgress.start()
  // 获取 token
  const hasToken = getToken()
  const userStore = useUserStore()
  const permissionStore = usePermissionStore()
  if (hasToken) {
    //  用token请求后端校验户信息，是否真实
    if (to.path === "/login") {
      // 已经登录了，去登录页，重定向到首页
      NProgress.done()
      return {
        path: "/",
        replace: true
      }
    } else {
      // 用token 换取 用户信息， 也有可能token是伪造的
      // 但，不能一刷新，就获取
      try {
        const hasRoles = userStore.state.roles.length > 0
        if (hasRoles) {
          NProgress.done()
          return true
        }
        // 如果无角色，请求 getUserInfo 接口，请求用户信息
        await userStore.getUserInfo()
        // const roles = userStore.state.roles
        // 用角色来生成菜单树
        // 超级管理员 使用 远程数据，生成的路由 - 返回所有路由，把常量路由 + 异步路由
        const routes = await permissionStore.generateRoutes()
        routes.forEach(router.addRoute) // 内部添加到映射表中
        // 添加完路由之后，可能异步的，你访问的时候刚加上去，没有效果，再跳一次，让他生效
        return router.push(to.path)
      } catch (e) {
        console.log(e)
        // 请求 getUserInfo 接口，失败说明token是伪造的，登出
        userStore.logout()
        NProgress.done()
        return "/login?redirect=" + to.path
      }
    }
  } else {
    // 如果没有 token, 但在白名单可访问页面，可以访问
    if (whiteList.includes(to.path)) {
      NProgress.done()
      return true
    }
    // 如果没有 token, 也不在白名单可访问页面，不可以访问其他页面
    // 跳转到登录页
    return {
      path: "/login",
      // 给与跳转后的重定向参数，还有其他参数
      // 刷新 和 跳转 其他页面
      query: {
        redirect: to.path,
        ...to.query
      }
    }
  }
})
